# -*- coding:utf-8 -*-
import random

from flask import current_app
from flask import json
from flask import make_response
from flask import request, jsonify

from ihome import constants
from ihome.models import User
from ihome.utils.response_code import RET
from ihome.utils.sms import CCP
from . import api
from ihome.utils.captcha.captcha import captcha
from ihome import  redis_story
import re,json

# 定义一个蓝图，由于触发短信的发送


@api.route("/sms_code", methods=["POST"])
def send_sms_code():

    # 获取参数，手机号，验证码，以及验证码图片编号

    # 1. 接收前端发送过来的参数
    # JSON字符串
    print ("1")
    json_data = request.data
    print(type(json_data))
    print ('2')
    print ("a =" + json_data)
    print ("3")
    # 转成字典
    json_dict = json.loads(json_data)
    mobile = json_dict.get("mobile")
    image_code = json_dict.get("image_code")
    image_code_id = json_dict.get("image_code_id")
    print(mobile)
    print (image_code)
    print (image_code_id)

    #  校验参数是否完整
    if not all([mobile,image_code,image_code_id]):


        # 如果不对，就直接返回一个json格式的给前端
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误2")

    # 通过正则验证手机号
    if not re.match("^1[34578][0-9]{9}",mobile):

        # 响应给前端
        return jsonify(errno=RET.PARAMERR, errmsg="手机号格式有误")


        # 4.1 校验该手机是否已经注册
    try:
        user = User.query.filter_by(mobile=mobile).first()
    except Exception as e:
        user = None  # 如果查询时出现错误，也需要给user初始化，如果不初始化，会报未定义的异常
        current_app.logger.error(e)
    if user:
        return jsonify(errno=RET.DATAEXIST, errmsg="该手机已被注册")
    #  通过图片标号去取真实的验证码
    try:
        real_image_code = redis_story.get("ImageCode:"+image_code_id)

    except Exception as e:
        # 用日志记录错误
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="查询验证码出错")

    # 如果没有到，代表验证码过期
    if not real_image_code:
        return jsonify(errno=RET.NODATA, errmsg="验证码已过期")

    # 与真实的验证码进行校验
    if real_image_code.lower() != image_code.lower():
        return  jsonify(errno=RET.DATAERR, errmsg="验证码输入不正确")

    # 日志输出图片验证码

    # current_app.logger.debug("图片验证：" + image_code)
    # 生成随机短信的6位验证码
    sms_code = "%06d"%random.randint(0,999999)

    # 记录验证码
    current_app.logger.debug('短信验证码：' + sms_code)

    # 调用第三方平台，发送短信，去传递参数，mobile,[随机验证码，过期时间]，以及模板
    result =  CCP().sendTemplateSMS(mobile,[sms_code,constants.SMS_CODE_REDIS_EXPIRES / 60],"1")
    if result != 1:

        return jsonify(errno = RET.THIRDERR,errmsg="发送验证码失败")

    # 将生成的验证码存到redis中，用电话来作为健，表示客户,mobile:XXXX
    try:
        redis_story.set("Mobile:" + mobile,sms_code,constants.SMS_CODE_REDIS_EXPIRES)

    except Exception as e:
        current_app.loger.debug(e)

        return jsonify(errno = RET.DBERR,errmsg = "保存验证码失败")

    # 返回响应给前端
    return  jsonify(errno = RET.OK,errmsg = "发送成功")




# 定义一方蓝图

@api.route("/image_code")
def get_image_code():

    # 接收request中的参数,args
    cur_id = request.args.get("cur_id")

    # 获取记录的上一次id
    pre_id = request.args.get("pre_id")
    print (pre_id)

    # 生成图片验证码
    name,text,image = captcha.generate_captcha()
    current_app.logger.debug("图片验证码为：" + text)

    # 将图片验证码内容通过图片编码保存到redis中,建，值，生命周期
    try:
        redis_story.set("ImageCode:"+cur_id,text,constants.IMAGE_CODE_REDIS_EXPIRES)

        # 记录上以此的图片id
        if pre_id:
            print (111)
            redis_story.delete("ImageCode:"+pre_id)


    except Exception as e:

        print(e)
        return jsonify(errno=RET.DBERR, errmsg="保存验证码数据失败")


    # 返回图片验证码的图片
    response = make_response(image)

    # 设置响应的内容类型
    response.headers["Content-Type"] = "image/jpg"

    #  进行返回
    return response


